}
else
{
- GdkWindowImplQuartz *impl;
NSWindow *nswindow;
- impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl);
- nswindow = impl->toplevel;
+ nswindow = gdk_quartz_window_search_for_nearest_nswindow (window);
point = [nswindow mouseLocationOutsideOfEventStream];
NSPoint point;
GdkQuartzNSWindow *nswindow;
- nswindow = (GdkQuartzNSWindow*)(((GdkWindowImplQuartz *)window->impl)->toplevel);
+ nswindow = gdk_quartz_window_search_for_nearest_nswindow (window);
point = [nswindow convertPointFromScreen:screen_point];
*x = point.x;
*y = window->height - point.y;
}
- if (toplevel)
- {
- get_window_point_from_screen_point (toplevel, screen_point, x, y);
- /* If the coordinates are out of window bounds, this toplevel is not
- * under the pointer and we thus return NULL. This can occur when
- * toplevel under pointer has not yet been updated due to a very recent
- * window resize. Alternatively, we should no longer be relying on
- * the toplevel_under_pointer value which is maintained in gdkwindow.c.
- */
- if (*x < 0 || *y < 0 || *x >= toplevel->width || *y >= toplevel->height)
- return NULL;
- }
+ if (toplevel == NULL)
+ return NULL;
+
+ /*
+ * Root window type does not need translation, but also does not have
+ * an associated NSWindow and therefore can't translate screen points
+ */
+ if (toplevel == _gdk_root)
+ return toplevel;
+
+ get_window_point_from_screen_point (toplevel, screen_point, x, y);
+ /* If the coordinates are out of window bounds, this toplevel is not
+ * under the pointer and we thus return NULL. This can occur when
+ * toplevel under pointer has not yet been updated due to a very recent
+ * window resize. Alternatively, we should no longer be relying on
+ * the toplevel_under_pointer value which is maintained in gdkwindow.c.
+ */
+ if (*x < 0 || *y < 0 || *x >= toplevel->width || *y >= toplevel->height)
+ return NULL;
return toplevel;
}
toplevel = toplevel_under_pointer;
- toplevel_impl = (GdkWindowImplQuartz *)toplevel->impl;
+ toplevel_impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl);
*x = x_tmp;
*y = y_tmp;
/* Resizing from the resize indicator only begins if an GDK_QUARTZ_LEFT_MOUSE_BUTTON
* event is received in the resizing area.
*/
- toplevel_impl = (GdkWindowImplQuartz *)toplevel->impl;
+ toplevel_impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl);
if ([toplevel_impl->toplevel showsResizeIndicator])
if ([event type] == GDK_QUARTZ_LEFT_MOUSE_DOWN &&
[toplevel_impl->toplevel showsResizeIndicator])
#include "gdkquartzglcontext.h"
#include "gdkquartzwindow.h"
#include "gdkprivate-quartz.h"
-#include "gdkquartz-cocoa-access.h"
+#include "gdkinternal-quartz.h"
#include "gdkinternals.h"
if (attached)
{
- NSView *view = gdk_quartz_window_get_nsview (window);
+ NSView *view = gdk_quartz_window_search_for_nearest_nsview (window);
if ([view respondsToSelector:@selector(setWantsBestResolutionOpenGLSurface:)])
[view setWantsBestResolutionOpenGLSurface:YES];
* GdkQuartzWindowImpl
*/
+static inline NSObject *
+gdk_quartz_window_search_for_nearest_nsobject (GdkWindow *window, bool get_nswindow_instead_of_nsview)
+{
+ GdkWindow *onscreen_window = window;
+ NSObject *nsobject = NULL;
+
+ if (GDK_WINDOW_DESTROYED (window))
+ return NULL;
+
+ /*
+ * if window is type GDK_WINDOW_OFFSCREEN
+ * you need to get the embedder in order to find the NSView
+ * see: gdkdevice.c:1461
+ */
+ while (1)
+ {
+ g_return_val_if_fail (onscreen_window != NULL, NULL);
+
+ if (GDK_IS_WINDOW_IMPL_QUARTZ (onscreen_window->impl))
+ {
+ if (get_nswindow_instead_of_nsview)
+ nsobject = GDK_WINDOW_IMPL_QUARTZ (onscreen_window->impl)->toplevel;
+ else
+ nsobject = GDK_WINDOW_IMPL_QUARTZ (onscreen_window->impl)->view;
+
+ if (nsobject != NULL)
+ break;
+ }
+
+ if (onscreen_window->window_type == GDK_WINDOW_OFFSCREEN)
+ onscreen_window = gdk_offscreen_window_get_embedder (onscreen_window);
+ else
+ onscreen_window = onscreen_window->parent;
+ }
+
+ g_return_val_if_fail (nsobject != NULL, NULL);
+
+ return nsobject;
+}
+
+NSView *
+gdk_quartz_window_search_for_nearest_nsview (GdkWindow *window)
+{
+ return (NSView *)gdk_quartz_window_search_for_nearest_nsobject (window, FALSE);
+}
+
+NSWindow *
+gdk_quartz_window_search_for_nearest_nswindow (GdkWindow *window)
+{
+ return (NSWindow *)gdk_quartz_window_search_for_nearest_nsobject (window, TRUE);
+}
+
NSView *
gdk_quartz_window_get_nsview (GdkWindow *window)
{
- if (GDK_WINDOW_DESTROYED (window))
+ if (GDK_WINDOW_DESTROYED (window) || !GDK_IS_WINDOW_IMPL_QUARTZ (window->impl))
return NULL;
- return ((GdkWindowImplQuartz *)window->impl)->view;
+ return GDK_WINDOW_IMPL_QUARTZ (window->impl)->view;
}
NSWindow *
gdk_quartz_window_get_nswindow (GdkWindow *window)
{
- if (GDK_WINDOW_DESTROYED (window))
+ if (GDK_WINDOW_DESTROYED (window) || !GDK_IS_WINDOW_IMPL_QUARTZ (window->impl))
return NULL;
- return ((GdkWindowImplQuartz *)window->impl)->toplevel;
+ return GDK_WINDOW_IMPL_QUARTZ (window->impl)->toplevel;
}
static CGContextRef
g_object_unref (impl->transient_for);
if (impl->view)
- [[NSNotificationCenter defaultCenter] removeObserver: impl->toplevel
- name: @"NSViewFrameDidChangeNotification"
- object: impl->view];
+ {
+ [[NSNotificationCenter defaultCenter] removeObserver: impl->toplevel
+ name: @"NSViewFrameDidChangeNotification"
+ object: impl->view];
+ [impl->view release];
+ }
G_OBJECT_CLASS (parent_class)->finalize (object);
}
gdk_window_impl_quartz_init (GdkWindowImplQuartz *impl)
{
impl->type_hint = GDK_WINDOW_TYPE_HINT_NORMAL;
+ impl->view = NULL;
+ impl->toplevel = NULL;
}
static gboolean
GdkWindowImplQuartz *toplevel_impl;
NSWindow *nswindow;
- toplevel_impl = (GdkWindowImplQuartz *)toplevel->impl;
+ toplevel_impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl);
nswindow = toplevel_impl->toplevel;
#if MAC_OS_X_VERSION_MIN_REQUIRED < 101400
/* In theory, we could skip the flush disabling, since we only
(attributes->cursor) :
NULL));
- impl->view = NULL;
- impl->toplevel = NULL;
-
if (attributes_mask & GDK_WA_TYPE_HINT)
{
type_hint = attributes->type_hint;
selector: @selector (windowDidResize:)
name: @"NSViewFrameDidChangeNotification"
object: impl->view];
- [impl->view release];
}
break;
/* GdkWindows should be hidden by default */
[impl->view setHidden:YES];
[parent_impl->view addSubview:impl->view];
- [impl->view release];
}
}
break;
{
GdkWindowImplQuartz *impl;
- impl = (GdkWindowImplQuartz *)parent->impl;
+ impl = GDK_WINDOW_IMPL_QUARTZ (parent->impl);
impl->sorted_children = g_list_remove (impl->sorted_children, window);
impl->sorted_children = g_list_prepend (impl->sorted_children, window);
{
GdkWindowImplQuartz *impl;
- impl = (GdkWindowImplQuartz *)parent->impl;
+ impl = GDK_WINDOW_IMPL_QUARTZ (parent->impl);
impl->sorted_children = g_list_remove (impl->sorted_children, window);
impl->sorted_children = g_list_append (impl->sorted_children, window);
void gdk_quartz_window_release_context (GdkWindowImplQuartz *window,
CGContextRef context);
+_GDK_EXTERN /* Required for immmodule.cache */
+NSView * gdk_quartz_window_search_for_nearest_nsview (GdkWindow *window);
+_GDK_EXTERN /* Required for immmodule.cache */
+NSWindow * gdk_quartz_window_search_for_nearest_nswindow (GdkWindow *window);
+
/* Root window implementation for Quartz
*/
#include "gtkintl.h"
#include "gtkquartz.h"
#include "gdk/quartz/gdkquartz.h"
-#include "gdk/quartz/gdkquartz-cocoa-access.h"
+#include "gdk/quartz/gdkinternal-quartz.h"
#include "gdk/quartz/gdkquartz-gtk-only.h"
#include "gdk/quartz/gdkquartzdnd.h"
#include "gtkselectionprivate.h"
return NULL;
if (gtk_widget_is_toplevel (toplevel) && window)
- return [gdk_quartz_window_get_nsview (window) window];
+ return [gdk_quartz_window_search_for_nearest_nsview (window) window];
else
return NULL;
}
#include "gtklabel.h"
#include "gtkfilechooserentry.h"
#include "gtkfilefilterprivate.h"
-#include <quartz/gdkquartz-cocoa-access.h>
+#include "gdk/quartz/gdkinternal-quartz.h"
#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
typedef struct {
if (transient_for)
{
gtk_widget_realize (GTK_WIDGET (transient_for));
- data->parent = gdk_quartz_window_get_nswindow (gtk_widget_get_window (GTK_WIDGET (transient_for)));
+ data->parent = gdk_quartz_window_search_for_nearest_nswindow (gtk_widget_get_window (GTK_WIDGET (transient_for)));
if (gtk_native_dialog_get_modal (GTK_NATIVE_DIALOG (self)))
data->modal = TRUE;
return gtk_im_context_filter_keypress (qc->slave, event);
}
- nsview = gdk_quartz_window_get_nsview (qc->client_window);
+ nsview = gdk_quartz_window_search_for_nearest_nsview (qc->client_window);
win = (GdkWindow *)[(GdkQuartzView *)[[nsevent window] contentView] gdkWindow];
GTK_NOTE (MISC, g_print ("client_window: %p, win: %p, nsview: %p\n",
if (!GDK_IS_QUARTZ_WINDOW (qc->client_window))
return;
- NSView *nsview = gdk_quartz_window_get_nsview (qc->client_window);
+ NSView *nsview = gdk_quartz_window_search_for_nearest_nsview (qc->client_window);
if (!nsview)
return;
if (!GDK_IS_QUARTZ_WINDOW (qc->client_window))
return;
- nsview = gdk_quartz_window_get_nsview (qc->client_window);
- win = (GdkWindow *)[ (GdkQuartzView*)nsview gdkWindow];
+ nsview = gdk_quartz_window_search_for_nearest_nsview (qc->client_window);
+ if (nsview == NULL)
+ return;
+
+ win = (GdkWindow *)[(GdkQuartzView*)nsview gdkWindow];
+ if (win == NULL)
+ {
+ g_warning ("quartz_set_cursor_location received NULL gdkWindow");
+ return;
+ }
+
g_object_set_data (G_OBJECT (win), GIC_CURSOR_RECT, qc->cursor_rect);
}